package com.zhd.utils;

import java.math.BigDecimal;
import java.util.Map;

public class FormulaCalculateUtil {
	
	/**
	 * 葛南渗流
	 * @param paramMap
	 * @return
	 */
	public static BigDecimal shenliu(Object h, Object h0) {
		if(!String.valueOf(h).matches("-?[0-9]+.?[0-9]*")) {
			return null;
		}
		// 葛南mint配置公式：(1.4*POWER((H-H0),2.5))*3600
		// (H-H0)结果单位为毫米需要除以1000转为米，即(H-H0)/1000
		// (H-H0)
		BigDecimal first = new BigDecimal(String.valueOf(h))
				.subtract(new BigDecimal(String.valueOf(h0)));
		// Math.pow(上步结果,2.5))
		Double second = Math.pow(first.doubleValue(), 2.5d);
		// 1.4*上步结果*3600
		BigDecimal third = new BigDecimal(1.4)
				.multiply(BigDecimal.valueOf(second))
				.multiply(new BigDecimal(3600))
				.setScale(4, BigDecimal.ROUND_DOWN);
		return third;
	}
	
	/**
	 * 葛南测缝
	 * @param paramMap
	 * @return
	 */
	public static BigDecimal cefeng(Map<String, Object> paramMap) {
		// 葛南mint配置公式：k*(F-F0)
		// 物联网配置公式：k*(C0-F0)
		// 参数说明：k-灵敏度系数、C0-采集值、F0-模数基准值，其余均为常量
		BigDecimal result = new BigDecimal(String.valueOf(paramMap.get("C0")))
				.subtract(new BigDecimal(String.valueOf(paramMap.get("F0"))))
				.multiply(new BigDecimal(String.valueOf(paramMap.get("k"))));
		return result.setScale(4, BigDecimal.ROUND_DOWN);
	}
	
	/**
	 * 葛南雨量
	 * @param paramMap
	 * @return
	 */
	public static BigDecimal yuliang(Map<String, Object> paramMap) {
		// 葛南mint配置公式：F*k
		// 物联网配置公式：C0*k
		// 参数说明：k-分辨率、C0-采集值，其余均为常量
		BigDecimal result = new BigDecimal(String.valueOf(paramMap.get("C0")))
				.multiply(new BigDecimal(String.valueOf(paramMap.get("k"))));
		return result.setScale(4, BigDecimal.ROUND_DOWN);
	}
	
	/**
	 * 葛南水位-1：k-(C0+C0/C0-1)/n
	 * @param paramMap
	 * @return
	 */
	public static BigDecimal shuiwei1(Map<String, Object> paramMap) {
		// 葛南mint配置公式：k-(F+F/F-m)/n
		// 物联网配置公式：k-(C0+C0/C0-m)/n
		// 参数说明：k-基准值、C0-采集值，其余均为常量
		String c0 = String.valueOf(paramMap.get("C0"));
		if(new BigDecimal(c0).compareTo(new BigDecimal(0)) == 0) {
			return null;
		}
		/*按步骤解析公式*/
		// 1.计算(C0+C0/C0-1)/n
		BigDecimal first = new BigDecimal(String.valueOf(paramMap.get("C0")))
				.divide(new BigDecimal(String.valueOf(paramMap.get("C0"))), 4, BigDecimal.ROUND_DOWN)
				.add(new BigDecimal(String.valueOf(paramMap.get("C0"))))
				.subtract(new BigDecimal(String.valueOf(paramMap.get("m"))))
				.divide(new BigDecimal(String.valueOf(paramMap.get("n"))), 4, BigDecimal.ROUND_DOWN);
		// 2.计算k-上步结果
		BigDecimal second = new BigDecimal(String.valueOf(paramMap.get("k")))
				.subtract(first);
		return second.setScale(4, BigDecimal.ROUND_DOWN);
	}
	
	/**
	 * 葛南水位-2：k+C0/n
	 * @param paramMap
	 * @return
	 */
	public static BigDecimal shuiwei2(Map<String, Object> paramMap) {
		// 葛南mint配置公式：k+C0/n
		// 物联网配置公式：k+C0/n
		// 参数说明：k-基准值、C0-采集值，其余均为常量
		/*按步骤解析公式*/
		BigDecimal result = new BigDecimal(String.valueOf(paramMap.get("C0")))
				.divide(new BigDecimal(String.valueOf(paramMap.get("n"))), 4, BigDecimal.ROUND_DOWN)
				.add(new BigDecimal(String.valueOf(paramMap.get("k"))));
		return result.setScale(4, BigDecimal.ROUND_DOWN);
	}
	
	/**
	 * 葛南水位-八角庙
	 * 水位=水深+设备安装高程(430.681)
	 * @param paramMap
	 * @return
	 */
	public static BigDecimal shuiwei3(Map<String, Object> paramMap) {
		
		return null;
	}
	
	/**
	 * 葛南渗压
	 * @param paramMap
	 * @return
	 */
	public static BigDecimal shenya(Map<String, Object> paramMap) {
		// 葛南mint配置公式：(k*(F0-F)+b*(T-T0))/n
		// 物联网配置公式：(k*(F0-C0)+b*(C1-T0))/n
		// 参数说明：k-灵敏度系数、F0-模数基准值、b-温度修正系数、T0-温度基准值、C0 C1采集值，其余均为常量
		/*按步骤解析公式*/
		// 1.计算k*(F0-F)
		BigDecimal first = new BigDecimal(String.valueOf(paramMap.get("F0")))
				.subtract(new BigDecimal(String.valueOf(paramMap.get("C0"))))
				.multiply(new BigDecimal(String.valueOf(paramMap.get("k"))));
		// 2.计算b*(C1-T0)
		BigDecimal second = new BigDecimal(String.valueOf(paramMap.get("C1")))
				.subtract(new BigDecimal(String.valueOf(paramMap.get("T0"))))
				.multiply(new BigDecimal(String.valueOf(paramMap.get("b"))));
		// 3.计算(结果1+结果2)/n
		BigDecimal third = first.add(second)
				.divide(new BigDecimal(String.valueOf(paramMap.get("n"))), 4, BigDecimal.ROUND_DOWN);
		return third.setScale(4, BigDecimal.ROUND_DOWN);
	}
	
	public static void main(String[] args) {
		System.out.println(FormulaCalculateUtil.shenliu(0.260, 0.262));
	}
}
